package com.yumingjiang.weichatgtp.service.impl;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.yumingjiang.weichatgtp.service.JwtTokenService;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Desc：
 * @创建人：Mr.Yu
 * @创建时间：$ JwtToken.java creatTime:2019/9/12 22:50 v 1.0  $
 */
@Service
public class JwtTokenServiceImpl implements JwtTokenService {

    /**
     * 公共密钥：保存在服务器客户端是不知道的
     */
    private String secret = "chatgpt_anto0_jwttoken_key";

    @Override
    public String createToken(String username, String address, String phone, int expirationTime) {
        /**
         * 签发时间
         */
        Date issueDate = new Date();

        /**
         * 过期时间:1分钟
         */
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE, expirationTime);
        Date time = instance.getTime();

        /**
         * 设置token的header信息
         * -->1、声明类型，这里是jwt
         * -->声明加密的算法 通常直接使用 HMAC SHA256
         */
        Map<String, Object> header = new HashMap<String, Object>(3);
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        /**
         * 生成token
         */
        String accessToken = JWT.create().withHeader(header)//设置header
                .withClaim("name", username)//设置payload
                .withClaim("address", address)
                .withClaim("phone", phone)
                .withExpiresAt(time)//设置token过期时间
                .withIssuedAt(issueDate)//设置token签发的时间
                .sign(Algorithm.HMAC256(secret));//设置签名
        return accessToken;
    }

    @Override
    public Boolean verifiedToken(String accessToken) throws Exception {
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
        DecodedJWT jwt = null;
        try {
            jwt = jwtVerifier.verify(accessToken);
        } catch (Exception e) {
            throw new RuntimeException("登陆凭证已过期，请重新登陆！！！");
        }
        return true;
    }
}